#include "jeuSDL.h"

/* Fonctions Jeu SDL */

int jeuSDL(SDLjeu *sjeu)
{

	SDL_Event event;
    int clicx, clicy;

	int ret;
	int stop = 0, perdu = 0, rejouer = 0;
    int continuer =  calculCasesRestantes(sjeu->grillejeu);

	initSDL(sjeu);

    afficherGrilleSDL(sjeu);
    afficherSmileySDL(sjeu, JAUNE);
    SDL_Flip(sjeu->ecran);

    while (continuer > 0 && !perdu && !stop && !rejouer)
    {
        SDL_WaitEvent(&event);

        switch(event.type)
        {
            case SDL_MOUSEBUTTONUP:
                if (((event.button.x>TAILLE_CASE) && (event.button.x < TAILLE_CASE*(getDimX(sjeu->grillejeu)-1))
                        && (event.button.y>TAILLE_CASE) && (event.button.y<TAILLE_CASE * (getDimY(sjeu->grillejeu)-1))))
                {   /* Clic dans la grille */
                	trouverCaseSDL(event, &clicx, &clicy);
                    if (event.button.button == SDL_BUTTON_LEFT)
                    {
                        ret = traitementGrille(sjeu->grillejeu, clicx, clicy);
                        if(ret == MINE)
                        {
                        	perdu = TRUE;
                        	afficherSmileySDL(sjeu, ROUGE);
                        }
                        else
                        {
                        	continuer = ret;
                        	if(continuer == 0)
                        		afficherSmileySDL(sjeu, VERT);
                        	else
                        		afficherSmileySDL(sjeu, JAUNE);
                        }
                    }
                    else if (event.button.button == SDL_BUTTON_RIGHT)
                    {
                        gestionDrapeau(sjeu->grillejeu, clicx, clicy);
                    }
                    afficherGrilleSDL(sjeu);
                    SDL_Flip(sjeu->ecran);
                }
                if ((event.button.x > sjeu->smiley.pos.x) && (event.button.x < TAILLE_SMILEY+sjeu->smiley.pos.x)
                        && (event.button.y > sjeu->smiley.pos.y) && (event.button.y < TAILLE_SMILEY+sjeu->smiley.pos.y))
                {   /* Clic sur le smiley */
                    rejouer = TRUE;
                }
                break;
             case SDL_QUIT:
                stop = TRUE;
                rejouer = FALSE;
                break;
        }
    }

	if(stop != TRUE && rejouer == FALSE)
    	rejouer = pause(sjeu);
    	
    detruireSDL(sjeu);
    
    return rejouer;
}

void initSDL(SDLjeu *sjeu)
{
	assert(SDL_Init(SDL_INIT_VIDEO) != -1);
	assert(TTF_Init() != -1);

    sjeu->ecran=SDL_SetVideoMode(getDimX(sjeu->grillejeu)*TAILLE_CASE, getDimY(sjeu->grillejeu)*TAILLE_CASE+TAILLE_SMILEY + 50, 32, SDL_HWSURFACE);
    SDL_WM_SetCaption("Demineur", NULL);

    initImagesSDL(sjeu);
    initTexteSDL(&sjeu->compteur, getDimY(sjeu->grillejeu));
    initSmileySDL(&sjeu->smiley, getDimX(sjeu->grillejeu), getDimY(sjeu->grillejeu));
}

void initImagesSDL(SDLjeu *sjeu)
{
    sjeu->images=(SDL_Surface **)malloc(NB_IMAGES*sizeof(SDL_Surface *));
    assert(sjeu->images != NULL);

    sjeu->images[0]=SDL_LoadBMP("data/zero.bmp");
    sjeu->images[1]=SDL_LoadBMP("data/un.bmp");
    sjeu->images[2]=SDL_LoadBMP("data/deux.bmp");
    sjeu->images[3]=SDL_LoadBMP("data/trois.bmp");
    sjeu->images[4]=SDL_LoadBMP("data/quatre.bmp");
    sjeu->images[5]=SDL_LoadBMP("data/cinq.bmp");
    sjeu->images[6]=SDL_LoadBMP("data/six.bmp");
    sjeu->images[7]=SDL_LoadBMP("data/sept.bmp");
    sjeu->images[8]=SDL_LoadBMP("data/huit.bmp");
    sjeu->images[9]=SDL_LoadBMP("data/bombe.bmp");
    sjeu->images[10]=SDL_LoadBMP("data/cache.bmp");
    sjeu->images[11]=SDL_LoadBMP("data/drapeau.bmp");
}

void detruireSDL(SDLjeu *sjeu)
{
    libererImagesSDL(sjeu);
    detruireSmileySDL(&sjeu->smiley);
    detruireTexteSDL(&sjeu->compteur);
    
    SDL_FreeSurface(sjeu->ecran);

    TTF_Quit();
    SDL_Quit();
}

void libererImagesSDL(SDLjeu *sjeu)
{
	int i;
	
	for(i=0;i<NB_IMAGES;i++)
    {
        SDL_FreeSurface(sjeu->images[i]);
    }
    free(sjeu->images);
}

void afficherGrilleSDL(SDLjeu *sjeu)
{
    SDL_Rect pos;
	unsigned int i,j;
	int valeur;

    for(i=1;i<getDimX(sjeu->grillejeu) - 1;i++)
    {
        for(j=1;j<getDimY(sjeu->grillejeu) - 1;j++)
        {
            pos.x = i * TAILLE_CASE;
            pos.y = j * TAILLE_CASE;
            if(!drapeauPresent(getCase(sjeu->grillejeu, i, j)))
            {
                if(!estDecouverte(getCase(sjeu->grillejeu, i, j))) /* Afficher la case "cachee" */
                    SDL_BlitSurface(sjeu->images[10], NULL, sjeu->ecran, &pos);
                else /* Afficher la valeur de la case */
                {
                    valeur=getValeur(getCase(sjeu->grillejeu, i, j));
                    
                    if(valeur == MINE)
                        valeur=9; /* bombe en case 9 dans le tableau d'images */
                        
                    SDL_BlitSurface(sjeu->images[valeur], NULL, sjeu->ecran, &pos);
                }
            }
            else /* Afficher un drapeau */
                SDL_BlitSurface(sjeu->images[11], NULL, sjeu->ecran, &pos);
        }
    }
	afficherCasesRestantesSDL(sjeu);
}


void trouverCaseSDL(const SDL_Event event, int *x, int *y)
{
    *x=event.button.x/TAILLE_CASE;
    *y=event.button.y/TAILLE_CASE;
}

/* Fonctions Texte */
void initTexteSDL(SDLtexte *texte, const int dimy)
{
	texte->police = TTF_OpenFont("data/police.ttf", 20);
    texte->couleurPolice.r = 100;
    texte->couleurPolice.g = 100;
    texte->couleurPolice.b = 100;
    texte->pos.x = 15;
    texte->pos.y = dimy * (TAILLE_CASE - 1);
}

void detruireTexteSDL(SDLtexte *texte)
{
	TTF_CloseFont(texte->police);
}


void afficherCasesRestantesSDL(SDLjeu *sjeu)
{
	char ligne[30];
	int cpt = calculCasesRestantes(sjeu->grillejeu);
	SDL_Color fond = {0,0,0};

	sprintf(ligne, "Cases restantes : %3d   ", cpt);
	sjeu->compteur.ligne = TTF_RenderText_Shaded(sjeu->compteur.police, ligne, sjeu->compteur.couleurPolice,fond);
	SDL_BlitSurface(sjeu->compteur.ligne, NULL, sjeu->ecran, &(sjeu->compteur.pos));
}


/* Fonctions Smiley */
void initSmileySDL(SDLsmiley *smiley, const int dimx, const int dimy)
{
	smiley->images_smiley = (SDL_Surface **)malloc(NB_SMILEYS * sizeof(SDL_Surface *));
    assert(smiley->images_smiley != NULL);

    smiley->images_smiley[0]=SDL_LoadBMP("data/smiley_jaune.bmp");
    smiley->images_smiley[1]=SDL_LoadBMP("data/smiley_vert.bmp");
    smiley->images_smiley[2]=SDL_LoadBMP("data/smiley_rouge.bmp");

    smiley->pos.x = dimx * TAILLE_CASE / 2 - TAILLE_SMILEY /2 ;
    smiley->pos.y = dimy * TAILLE_CASE + 30;
}

void detruireSmileySDL(SDLsmiley *smiley)
{
    int i;
    for(i=0;i<NB_SMILEYS;i++)
        SDL_FreeSurface(smiley->images_smiley[i]);
    free(smiley->images_smiley);
}

void afficherSmileySDL(SDLjeu *sjeu, const int i)
{
	SDL_BlitSurface(sjeu->smiley.images_smiley[i], NULL, sjeu->ecran, &(sjeu->smiley.pos));
}


/* Fonctions générales */
int pause(const SDLjeu *sjeu)
{
    int continuer = 1;
    int rejouer;    
    SDL_Event event;

    while (continuer)
    {
        SDL_WaitEvent(&event);
        switch(event.type)
        {
            case SDL_QUIT:
                continuer = 0;
                rejouer = FALSE;
                break;
            case SDL_MOUSEBUTTONUP:
            	if ((event.button.x > sjeu->smiley.pos.x) && (event.button.x < TAILLE_SMILEY+sjeu->smiley.pos.x)
                        && (event.button.y > sjeu->smiley.pos.y) && (event.button.y < TAILLE_SMILEY+sjeu->smiley.pos.y))
                continuer = 0;
                rejouer = TRUE;
                break;     
        }
    }
    return rejouer;
}




